#include "UdpServer.hpp"
#include <memory>
#include <cstdio>
#include<vector>
// "120.78.126.148" 点分十进制字符串风格的IP地址

void Usage(std::string proc)
{
    std::cout << "\n\rUsage: " << proc << " port[1024+]\n" << std::endl;
}

std::string Handler(const std::string &str)
{
    std::string res = "Server get a message: ";
    res += str;
    std::cout << res << std::endl;

    // pid_t id = fork();
    // if(id == 0)
    // {
    //     // ls -a -l -> "ls" "-a" "-l"
    //     // exec*();
    // }
    return res;
}
bool SafeCheck(const std::string &cmd)
{
    std::vector<std::string> waringkey{
        "rm",
        "mv",
        "cp",
        "kill",
        "sudo",
        "unlink",
        "uninstall",
        "yum",
        "top",
        "while"
    };
    for(const auto& str:waringkey)
    {
       auto pos=cmd.find(str);
       if(pos!=std::string::npos)
       {
        return false;
       }
    }
    return true;
}
std::string ExcuteCommand(const std::string &cmd)
{
    std::cout<<"Check cmd is safe"<<std::endl;
    if(!SafeCheck(cmd))
    {
       return "the cmd is unsafe...";
    }

    FILE *fp = popen(cmd.c_str(), "r");
    //popen() 函数通过创建一个管道，调用 fork 产生一个子进程，然后子进程执行一个 shell 以运行命令来开启一个进程
    //从管道中读取命令的输出（如果 type 是 'r'）或向管道写入数据作为命令的输入（如果 type 是 'w'）。
    if(nullptr == fp)
    {
        perror("popen");
        return "error";
    }
    std::string result;
    char buffer[4096];
    while(true)
    {
        char *ok = fgets(buffer, sizeof(buffer), fp);
        //函数从指定的流（stream）中读取最多size - 1个字符，并将它们存储在由参数s 所指向的缓冲区（buffer）中
        if(ok == nullptr) /*读到文件结束时返回nullptr/error*/break;
        result += buffer;
    }
    pclose(fp);

    return result;
}

// ./udpserver port
int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        exit(0);
    }

    uint16_t port = std::stoi(argv[1]);

    std::unique_ptr<UdpServer> svr(new UdpServer(port));

    svr->Init(/**/);
    svr->Run(Handler);

    return 0;
}